Completed
Push — master ( 3ce364...b1ab6e )
by Andres
58s
created

angular.service(ꞌreactionꞌ)   B

Complexity

Conditions 1
Paths 4

Size

Total Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 1
c 3
b 0
f 0
nc 4
dl 0
loc 40
rs 8.8571
nop 1

2 Functions

Rating   Name   Duplication   Size   Complexity  
C ��) 0 24 9
A ��) 0 11 3
1
/**
2
 reaction
3
 Service that processes a reaction i.e. it converts reactants to products.
4
 Many phenomenons, including decay, redox and reactions, use the react function.
5
6
 @namespace Services
7
 */
8
'use strict';
9
10
angular
11
  .module('game')
12
  .service('reaction', ['state',
13
    function(state) {
14
      // FIXME: move to util?
15
        function isReactionCostMet (number, reaction, playerData) {
16
          let keys = Object.keys(reaction.reactant);
17
          for (let i = 0; i < keys.length; i++) {
18
            let available = playerData.resources[keys[i]].number;
19
            let required = number * reaction.reactant[keys[i]];
20
            if (required > available) {
21
              return false;
22
            }
23
          }
24
          return true;
25
        }
26
27
      /* Transforms reactants to products */
28
      this.react = function(number, reaction, playerData) {
29
        if (!Number.isInteger(number) || number <= 0 ||
30
            !reaction.reactant || !reaction.product) {
31
          return;
32
        }
33
        if (isReactionCostMet(number, reaction, playerData)) {
34
          let reactant = Object.keys(reaction.reactant);
35
          for (let i = 0; i < reactant.length; i++) {
36
            let required = number * reaction.reactant[reactant[i]];
37
            playerData.resources[reactant[i]].number -= required;
38
            playerData.resources[reactant[i]].number = playerData.resources[reactant[i]].number;
39
          }
40
          let product = Object.keys(reaction.product);
41
          for (let i = 0; i < product.length; i++) {
42
            let produced = number * reaction.product[product[i]];
43
            let current = playerData.resources[product[i]].number;
44
            playerData.resources[product[i]].number = current + produced;
45
            if (!playerData.resources[product[i]].unlocked) {
46
              playerData.resources[product[i]].unlocked = true;
47
              state.addNew(product[i]);
48
            }
49
          }
50
        }
51
      };
52
    }
53
  ]);
54